#include "memlayout.h"
#include "mmu/mmu.h"
#include "kernel.h"

.p2align 2
.text 

# entry 是链接地址(虚拟地址)，_start是对应的物理地址
.globl _start
_start = V2P_WO(entry)

.globl entry
entry:
    # 使用 4M 页大小
    movl    %cr4, %eax
    orl     $(CR4_PSE), %eax
    movl    %eax, %cr4

    # 设置页目录基址
    movl    $(V2P_WO(kernel_tmp_pgdir)), %eax
    movl    %eax, %cr3

    # 使能分页机制
    movl    %cr0, %eax
    orl     $(CR0_PG | CR0_WP), %eax
    movl    %eax, %cr0

    # 设置栈地址
    movl    $(stack + KSTACKSIZE), %esp

    # 跳转到 main 入口，同时内核切换到高地址运行
    mov     $main, %eax
    jmp     *%eax

# 分配栈空间
.comm stack, KSTACKSIZE
